/*
 * 
 */
package transactions;


import data.UserDO;
import data.UserData;
import utils.Transaction;



/**
 *
 * @author Felipe
 */
public class User {
    
    //Função para verificar o preenchimento dos campos do user
    static public boolean [] confereUser (String email, String confirma_email,
            String senha, String confirma_senha, String data_nasc, String nome,
            String sobrenome, String cpf, String ddd, String tel, String sexo,
            String estado_civil,String n_pessoas_residencia,String tipo_moradia,
            String educacao, String profissao, String renda){
        
        //Verificações, true = verificação Ok, false = erro
        boolean verifica [] = new boolean [22];
        
        //Inicializa com tudo false (true)
        for (int i = 0; i < verifica.length; i++) {
            verifica[i]=false;
        }
                 
        //Verificações de Campos preenchidos
        
        //email
        if(!email.isEmpty()){
           verifica[0] = true;                     
        }
        
        //confirma email
        if(!confirma_email.isEmpty()){
           verifica[1] = true;                     
        }
        
        //senha
        if(!senha.isEmpty()){
           verifica[2] = true;                     
        }
                
        //confirma_senha
        if(!confirma_senha.isEmpty()){
           verifica[3] = true;                     
        }
        
        //data_nasc
        if(!data_nasc.isEmpty()){
           verifica[4] = true;                     
        }
        
        //nome
        if(!nome.isEmpty()){
           verifica[5] = true;                     
        }
        
        //sobrenome
        if(!sobrenome.isEmpty()){
           verifica[6] = true;                     
        }
        
        //cpf
        if(!cpf.isEmpty()){
           verifica[7] = true;                     
        }
        
        //ddd
        if(!ddd.isEmpty()){
           verifica[8] = true;                     
        }
        
        //tel
        if(!tel.isEmpty()){
           verifica[9] = true;                     
        }
        
        //sexo
        if(!sexo.isEmpty()){
           verifica[10] = true;                     
        }
        
        //estado_civil
        if(!estado_civil.isEmpty()){
           verifica[11] = true;                     
        }
        
        //n_pessoas_residencia
        if(!n_pessoas_residencia.isEmpty()){
           verifica[12] = true;                     
        }
        
        //tipo_moradia
        if(!tipo_moradia.isEmpty()){
           verifica[13] = true;                     
        }
        
        //educacao
        if(!educacao.isEmpty()){
           verifica[14] = true;                     
        }
        
        //profissao
        if(!profissao.isEmpty()){
           verifica[15] = true;                     
        }
        
        //renda
        if(!renda.isEmpty()){
           verifica[16] = true;                     
        }
        
        //Verificações de compatibilidade (iguais = true)
        
        //senha
        if(senha.equals(confirma_senha)){
            verifica[17] = true;
        }
        
        //email
        if(email.equals(confirma_email)){
            verifica[18] = true;
        }
        
        //CPF válido, conforme a lógica exposta na descrição do caso de uso
        //transforma em long o cpf.
        long CPF = Long.parseLong(cpf);
        
        
        //Separação de digitos do cpf, guarda no vetor cpfseparado
        long [] cpfseparado = new long [11];
        
        for (int a = 0; a < cpfseparado.length; a++){
            cpfseparado[10-a]=CPF%10;
            CPF=CPF/10;
        }
        
        //verificação do dígito j
        long cpfsomado1 = 0;
        for (int x=0; x<cpfseparado.length-2; x++){
            cpfsomado1 += (10-x)*cpfseparado[x];
        }
        
        long resto1 = cpfsomado1%11;
        long j;
        if ((resto1 == 0) || (resto1 == 1)){
            j = 0;
        } else
            j = 11 - resto1;
        
        if (j == cpfseparado[9]) {
            //Segue para verificação do digito k
            long cpfsomado2 = 0;
            for (int l=0; l<cpfseparado.length-1; l++){
                cpfsomado2 += (11-l)*cpfseparado[l];
            }
            
            long resto2 = cpfsomado2%11;
            long k;
            if ((resto2 == 0) || (resto2 == 1)){
                k = 0;
            } else
                k = 11 - resto2;
            
            if (k == cpfseparado[10]){
                verifica[19] = true;
            }
                        
        }
        
        //Verifica se já existe email cadastrado
        verifica[20] = true;
        
        //Verifica se já existe cpf cadastrado
        verifica[21] = true;
       
        
        return verifica;
        
    }
    
    
    //Função para inclusão
    public boolean incluir (UserDO user) {    

     // efetuando a transacao
     Transaction tr = null;
     try {

       tr = new Transaction();
     } catch (Exception e){
         e.printStackTrace();
     }
     if (tr !=null){
         try {
            UserData udata = new UserData();
            udata.incluir(user, tr);
            tr.commit();
            return true;
       
        } //se não der certo 
         catch(Exception e) {
              tr.rollback();
              System.out.println("erro ao incluir " + user.getNome());
              e.printStackTrace();
        }
        
        } // incluir
     return false;
   }
    
    //Função para busca
    public UserDO buscar (String email,String senha) throws Exception{    

     // efetuando a transacao
     Transaction tr = new Transaction();
     
         try {
            UserData udata = new UserData();
            UserDO usuario = udata.buscar(email,senha, tr);
            tr.commit();
            return usuario;
       
             }  //se não der certo
         catch(Exception e) {
              tr.rollback();
              e.printStackTrace();
              System.out.println("erro ao buscar " + email);      
        
            }
            return null;
    }
    
    //Função para edição
    public boolean editar (UserDO user) throws Exception{    

     // efetuando a transacao
     Transaction tr = new Transaction();
     if (tr !=null){
         try {
            UserData udata = new UserData();
            udata.editar(user, tr);
            tr.commit();
            return true;
       
        }//se não der certo 
         catch(Exception e) {
              tr.rollback();
              System.out.println("erro ao incluir " + user.getNome());
              e.printStackTrace();
        }
        
        } 
     return false;
   }
    
    /* --------------------------------- */
    /* Incluído por Joao em 20/11/2011 */
    /* --------------------------------- */
    //Função para exclusão
     public void excluir (Integer id) throws Exception{    

     // efetuando a transacao
     Transaction tr = new Transaction();
     if (tr !=null){
         try {
            UserData udata = new UserData();
            udata.excluir(id, tr);
            tr.commit();
       
        }//se não der certo 
         catch(Exception e) {
              tr.rollback();
              e.printStackTrace();
        }
        
        } 
   }
     
     
     public UserDO consultar (int user_id) throws Exception{    

     // efetuando a transacao
     Transaction tr = new Transaction();
     if (tr !=null){
         try {
            UserDO user = new UserDO();
            UserData udata = new UserData();
            user = udata.consultar(user_id, tr);
            tr.commit();
            return user;
       
        }//se não der certo 
         catch(Exception e) {
              tr.rollback();
              System.err.println("Não foi possível encontrar o usuário.");
              e.printStackTrace();
        }
        
        } 
     return null;
   }
    
}
